Skip to content

🗃️ Make archiving tables/applications a personal option#2476

Open
AndyScherzinger wants to merge 24 commits intomainfrom
feat/2125/personal-archiving-option
Open

🗃️ Make archiving tables/applications a personal option#2476
AndyScherzinger wants to merge 24 commits intomainfrom
feat/2125/personal-archiving-option

Conversation

@AndyScherzinger
Copy link
Copy Markdown
Member

@AndyScherzinger AndyScherzinger commented Apr 12, 2026

Archived categories Archive app Archive table Unarchive app Unarchive table
2026-04-12 15_33_25-Tables - Nextcloud — Mozilla Firefox 2026-04-12 15_34_51-Tables - Nextcloud — Mozilla Firefox 2026-04-12 15_34_35-Tables - Nextcloud — Mozilla Firefox 2026-04-12 15_34_05-Tables - Nextcloud — Mozilla Firefox 2026-04-12 15_33_50-Tables - Nextcloud — Mozilla Firefox

The original ticket #2125 defined tables and views, while this PR tacked tables and apps. Given a clear view on how archived views should get displayed this could be added as a follow-up PR to not make this PR grow in review-size and complexity.


Summary

  • This change replaces the existing single-user global archived flag on tables with a two-layer per-user model: an owner-level flag on the entity and a new tables_archive_user table that stores individual user overrides, so archive state is resolved per-user at read time. When an owner archives a table or application, it is automatically treated as archived for every user with access, but any of those users may override this for themselves; an owner unarchiving resets the state for everyone by clearing all per-user overrides.
  • The existing tables_tables.archived column is repurposed from a simple global toggle into the owner-level signal, and the database migration converts all currently-archived tables into owner-archived entries to preserve existing data without disruption.
  • Application (context) archiving is introduced as a completely new capability end-to-end: covering database schema, entity, service, API endpoints, routes, and frontend navigation - while table archiving is substantially reworked from a simple owner toggle into the full per-user propagation system.
  • A new ArchiveService centralizes all business logic for both resource types, four new API endpoints are split across ApiTablesController and ContextController following existing naming conventions, and the frontend gains archive/unarchive actions in both navigation item menus alongside a new collapsible "Archived applications" section mirroring the already-existing "Archived tables" section.

⚠️ Beware

The database migration only covers the owner and direct user shares, not groups, etc. since they can't be resolved directly via SQL (think teams/groups). So in these cases archived tables would resurface until manually archived by the respective user. Also there is no cleanup for teams/groups, if a user is taken out of a team, the archive meta-info would not get deleted. Only simple but confusing way around it would be to prevent archiving/unarchiving for tables/apps where a user is neither the owner nor a user-share receiver. Expensive alternative would be a housekeeping job checking all these archive bits periodically, but that also sounds expensive with little use. Else we would need to consume a team/group changes event and check if some cleanup is needed. WDYT?

@AndyScherzinger AndyScherzinger added enhancement New feature or request 2. developing Work in progress labels Apr 12, 2026
@AndyScherzinger AndyScherzinger changed the title Personal archiving option 🗃️ Make archiving tables/applications personal option Apr 12, 2026
@AndyScherzinger AndyScherzinger force-pushed the feat/2125/personal-archiving-option branch 5 times, most recently from 008f4f3 to 0e2bbdc Compare April 12, 2026 15:34
@AndyScherzinger AndyScherzinger changed the title 🗃️ Make archiving tables/applications personal option 🗃️ Make archiving tables/applications a personal option Apr 12, 2026
@AndyScherzinger AndyScherzinger force-pushed the feat/2125/personal-archiving-option branch 2 times, most recently from d3fce3e to fd235a6 Compare April 12, 2026 18:56
@AndyScherzinger AndyScherzinger marked this pull request as ready for review April 12, 2026 19:36
@AndyScherzinger AndyScherzinger added 3. to review Waiting for reviews and removed 2. developing Work in progress labels Apr 12, 2026
Copy link
Copy Markdown
Member

@jancborchardt jancborchardt left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks generally nice, 2 details

  • I’d say to use outline icons instead of filled for both cases, archiving and unarchiving
  • In the cases of "Archive app" and "Unarchive app", the sorting of actions in the menu is off. We always recommend the destructive action (Delete) to be the very last, and then the next most destructive like Archive could be directly above it.

@jancborchardt jancborchardt moved this to 🏗️ At engineering in 🖍 Design team Apr 28, 2026
@AndyScherzinger AndyScherzinger force-pushed the feat/2125/personal-archiving-option branch from fd235a6 to ba16212 Compare April 28, 2026 13:13
Comment thread lib/Db/UserArchive.php Outdated
Comment thread lib/Db/UserArchiveMapper.php Outdated
@AndyScherzinger AndyScherzinger force-pushed the feat/2125/personal-archiving-option branch 3 times, most recently from ed997d4 to 840a1ab Compare April 28, 2026 20:01
* add secondary index on (node_type, node_id) for deleteAllForNode
* document why archived boolean columns are not indexed

AI-assistant: Claude Code 2.1.101 (Claude Sonnet 4.6)

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
AndyScherzinger and others added 22 commits April 28, 2026 22:05
AI-assistant: Claude Code 2.1.101 (Claude Sonnet 4.6)

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
AI-assistant: Claude Code 2.1.101 (Claude Sonnet 4.6)

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
AI-assistant: Claude Code 2.1.101 (Claude Sonnet 4.6)

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
* clean up per-user archive records when table or context is deleted

AI-assistant: Claude Code 2.1.101 (Claude Sonnet 4.6)

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
…ransferred

AI-assistant: Claude Code 2.1.101 (Claude Sonnet 4.6)

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
AI-assistant: Claude Code 2.1.101 (Claude Sonnet 4.6)

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
AI-assistant: Claude Code 2.1.101 (Claude Sonnet 4.6)

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
AI-assistant: Claude Code 2.1.101 (Claude Sonnet 4.6)

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
AI-assistant: Claude Code 2.1.101 (Claude Sonnet 4.6)

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
AI-assistant: Claude Code 2.1.101 (Claude Sonnet 4.6)

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
AI-assistant: Claude Code 2.1.101 (Claude Sonnet 4.6)

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
AI-assistant: Claude Code 2.1.101 (Claude Sonnet 4.6)

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
…tion

AI-assistant: Claude Code 2.1.101 (Claude Sonnet 4.6)

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
AI-assistant: Claude Code 2.1.101 (Claude Sonnet 4.6)

Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
…ic also checks for it anyways

The context endpoints lack the #[RequirePermission] attribute that the table endpoints have.
However the mapper enforces the same constraint, but is less explicit for future maintenance and for consistency with other endpoints

AI-assistant: Claude Code v2.1.119 (Claude Sonnet 4.6)
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
Setting the parameter inside the loop preventing rebuilding the query representation if this really loops a lot.

Co-authored-by: Christoph Wurst <1374172+ChristophWurst@users.noreply.github.com>
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
…ust getXXX

Co-authored-by: Christoph Wurst <1374172+ChristophWurst@users.noreply.github.com>
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
AI-assistant: Claude Code 2.1.119 (Claude Sonnet 4.6)
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
@AndyScherzinger AndyScherzinger force-pushed the feat/2125/personal-archiving-option branch from 840a1ab to 086aad3 Compare April 28, 2026 20:06
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

3. to review Waiting for reviews enhancement New feature or request

Projects

Status: 🏗️ At engineering

Development

Successfully merging this pull request may close these issues.

3 participants